import axios, { AxiosInstance, AxiosResponse } from 'axios';
import https from 'https';

// 从环境变量中读取配置项
const tokenKey: string = process.env.tokenKey || 'token';
const baseUrl: string = process.env.baseUrl || ''; // 如果有全局 baseUrl

// 创建 https.Agent，实现 keepAlive 和最大并行连接数
const agent = new https.Agent({ keepAlive: true, maxSockets: 20 });

// 创建 axios 实例，设置默认配置
const instance: AxiosInstance = axios.create({
  baseURL: baseUrl,
  timeout: 300 * 1000, // 超时时间300秒
  httpsAgent: agent,
  headers: {
    get: { "Content-Type": "application/x-www-form-urlencoded;charset=utf-8" },
    post: { "Content-Type": "application/json;charset=utf-8" }
  }
});

// 请求拦截器：统一处理 token 和默认参数
instance.interceptors.request.use(
  (config: any) => {
    // 注入 token（此处可替换为你实际获取 token 的方式，比如使用 js-cookie 等）
    // 示例中 token 获取逻辑请自行完善
    const token = '';
    if (token) {
      config.headers = config.headers || {};
      config.headers[tokenKey] = token;
    }

    // 合并默认参数，例如 proId、language 等
    let data = config.method === 'get' ? config.params : config.data;
    if (!data || typeof data !== 'object' || Array.isArray(data)) {
      data = {};
      // 去除空值参数
      for (const key in data) {
        if (data[key] === null || data[key] === undefined || data[key] === '') {
          delete data[key];
        }
      }
    }
    if (config.method === 'get') {
      config.params = data;
    } else {
      config.data = data;
    }

    return config;
  },
  (error) => {
    console.error('[Axios Request Error]', error);
    return Promise.reject(error);
  }
);

// 响应拦截器：统一处理响应数据以及错误状态（如登录过期）
instance.interceptors.response.use(
  (response: AxiosResponse): any => {
    if (typeof window !== 'undefined') {
      setTimeout(() => { document.body.style.cursor = ''; }, 100);
    }
    // 假定接口返回的数据在 response.data 中
    const res = response.data;
    // 如果返回包含业务状态码（例如 code），则统一处理
    if (res && typeof res.code !== 'undefined') {
      if (res.code === 200) {
        return res;
      } else if (res.code === 401) {
        console.error('登录已过期');
        return Promise.reject(new Error('登录已过期'));
      } else {
        console.error(`[Axios Response] ${response.config.url}`, res);
        return Promise.reject(res);
      }
    }
    return res || response;
  },
  (error) => {
    console.error('[Axios Response Error]', error.message);
    return Promise.reject(error);
  }
);

export default instance; 